﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;

namespace 文件管理
{

    public static class FileLogger
    {
        private static readonly object _lock = new object();
        private static string _logDirectory = "Logs"; // 默认日志目录

        /// <summary>
        /// 设置日志存储目录（如果不设置，默认使用 ./Logs）
        /// </summary>
        public static void SetLogDirectory(string directory)
        {
            _logDirectory = directory;
        }

        /// <summary>
        /// 写入日志（自动按日期分文件）
        /// </summary>
        /// <param name="level">日志级别（Debug/Info/Warning/Error）</param>
        /// <param name="message">日志内容</param>
        /// <param name="exception">异常对象（可选）</param>
        public static void Log(string level, string message, Exception exception = null)
        {
            lock (_lock) // 确保线程安全
            {
                try
                {
                    // 确保日志目录存在
                    Directory.CreateDirectory(_logDirectory);

                    // 按日期生成日志文件名（如 Logs/2023-10-01.log）
                    string logFile = Path.Combine(_logDirectory, $"{DateTime.Now:yyyy-MM-dd}.log");

                    // 格式化日志内容
                    string logContent = $"[{DateTime.Now:HH:mm:ss}] [{level}] {message}";
                    if (exception != null)
                    {
                        logContent += $"\n[EXCEPTION] {exception.GetType().Name}: {exception.Message}\n{exception.StackTrace}";
                    }

                    // 写入文件（追加模式）
                    File.AppendAllText(logFile, logContent + Environment.NewLine);
                }
                catch (Exception ex)
                {
                    // 如果日志写入失败，尝试输出到控制台
                    Console.WriteLine($"日志记录失败: {ex.Message}");
                }
            }
        }

        // 快捷方法
        public static void Debug(string message) => Log("DEBUG", message);
        public static void Info(string message) => Log("INFO", message);
        public static void Warning(string message) => Log("WARNING", message);
        public static void Error(string message, Exception ex = null) => Log("ERROR", message, ex);
    }
}
